
// 1、遵守协议的对象具有协议属性，但是不用完全是,接口里的属性不全都是必需的
// interface LableValueInterface {
//     label : string;
//     color ?:string;
// }
//
// function printLableValue(lableObject:LableValueInterface) {
//      console.log(lableObject.label);
// }
//
// let  myobject = {label: '我是刘子彬你',name:"明智",age:"27"};
// printLableValue(myobject);

//赋值的时候，变量的形状必须和接口的形状保持一致

//2、可选属性
interface SquareConfigInterface {
    backgroundColor? : string;
    width? : number;
    color? : string;
    isbeautiful? : boolean;
}

function createSquare(config:SquareConfigInterface) : {color:string, s:number, backgroundColor:string}{
      let  news = {color : "white", s: 100, backgroundColor: "black"};
      if(config.color){
          news.color = config.color;
      }
      if(config.width){
          news.s = config.width * config.width;
      }

      if(config.backgroundColor){
          news.backgroundColor = config.backgroundColor;
      }
     return news;
};


let  newsquare = createSquare({backgroundColor:"red",width:10} as SquareConfigInterface);
console.log(newsquare);


// 3. 接口具有任意的属性
interface IPerson{
    readonly  id : number;
    name : string;
    age? : number;   //可选类型属性
    [propName : string] : any;  //允许有任意的属性
}

let tom : IPerson ={
     name :'Tom',
     tomee: "tomonni",
     age :23,
     id : 33444,
};

// let arraya:number[] = [1,2,3,4];
// let newarr: ReadonlyArray<number> = arraya;
// newarr[0] = 12; // error!
// newarr.push(5); // error!
// newarr.length = 100; // error!
// arraya = ro; // error!  arraya =  newarr as number[];

//3.函数类型的接口
// 为了使用接口表示函数类型，我们需要给接口定义一个调用签名
// //只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型
// interface SearchFunc {
//     (souce: string, substring: string) : boolean;
// }
//
// let searchfunc : SearchFunc;
// searchfunc = function (souce: string, substring: string) : boolean {
//       let result = souce.search(substring);
//       return result> -1;
// }


//4.可索引类型的接口 可索引类型具有一个 索引签名，它描述了对象索引的类型，还有相应的索引返回值类型。
//具有索引签名。 这个索引签名表示了当用 number去索引StringArray时会得到string类型的返回值。
interface StingInterface {
    [index : number] : string;
}
let myArray : StingInterface;
myArray = ["sddad","45455"];
let mystr = myArray[0];

//TypeScript支持两种索引签名：字符串和数字
// 可以同时使用两种类型的索引，但是数字索引的返回值必须是字符串索引返回值类型的子类型。
class Animal {
    name : string;
}

class  Dog extends Animal{
    age : string;
}

//同时使用number返回类型是string返回类型的子类
interface NotOkay {
    [index : string] : Animal;
    [index : number] : Dog;
}


// 5.类 类型接口

interface ClockInterface {
    currentTime : Date;
    setTime(d : Date);
}

class Colck implements ClockInterface{
    currentTime : Date;
    setTime(d : Date){
      this.currentTime =  d;
    }
    // constructor存在于类的静态部分
    constructor(h:number, m:number){};
}



